/*@@

	Copyright (c) 2010 BlueSky LTD. All rights reserved. 

	Created_datetime : 	2010-6-21

	File Name :	base_filelog.h

	Author : liusiliang (siliangliu@msn.com)

	Description : 

@@*/

#ifndef __BASE_FILELOG_H__
#define __BASE_FILELOG_H__

//////////////////////////////////////////////////////////////////////////
//						Header Include
//////////////////////////////////////////////////////////////////////////

#include "base_logdevice.h"

namespace BLK
{
	//////////////////////////////////////////////////////////////////////////
	//						Class Declare
	//////////////////////////////////////////////////////////////////////////

	class FileLog : public LogDevice
	{
	public:

		/*
		 *	构造函数
		 *	FileName	记录文件名字
		 *	bClearFile	是否清空文件
		 *	LL			LOG设备记录级别
		 */
		FileLog(
			const std::string& fileName = FILE_LOG_DEFAULT_NAME,
			bool bClearFile = false,
			LoggingLevel LL = BLK_LL_NORMAL);

		/*
		 *	析构函数
		 */
		virtual ~FileLog(void);

	public:

		/*
		 *	记录字符串 LOG 
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			const std::string& Log, 
			LogMsgLevel LML);

		/*
		 *	记录整型 LOG
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			int Log, 
			LogMsgLevel LML);

		/*
		 *	记录无符整型 LOG
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			unsigned Log, 
			LogMsgLevel LML);

		/*
		 *	记录长整型 LOG
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			long Log, 
			LogMsgLevel LML);

		/*
		 *	记录无符长整型 LOG
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			unsigned long Log, 
			LogMsgLevel LML);

		/*
		 *	记录浮点型 LOG
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			float Log, 
			LogMsgLevel LML);

		/*
		 *	记录double型 LOG
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			double Log, 
			LogMsgLevel LML);

		/*
		 *	记录 CHAR 型 LOG
		 *	Log	记录信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			char Log, 
			LogMsgLevel LML);

		/*
		 *	记录二进制 LOG
		 *	Log	记录二进制信息
		 *	LML	记录内容级别
		 */
		virtual void WriteLog(
			BinPair Log, 
			LogMsgLevel LML);

		/*
		 *	记录时间 LOG
		 *	TimeStamp	时间标志
		 */
		virtual void WriteAssistant(
			TimeStamp Temp,
			LogMsgLevel LML);

		/*
		 *	记录日期 LOG
		 *	DateStamp	日期标志
		 */
		virtual void WriteAssistant(
			DateStamp Temp,
			LogMsgLevel LML);

		/*
		 *	记录时间日期 LOG
		 *	TimeDateStamp	时间日期标志
		 */
		virtual void WriteAssistant(
			TimeDateStamp Temp,
			LogMsgLevel LML);

		/*
		 *	记录换行 LOG
		 *	EndL	换行标志
		 */
		virtual void WriteAssistant(
			EndL Temp,
			LogMsgLevel LML)
		{
			if(LML + m_LogLevel < BLK_LOG_THRESHOLD)
				return;

			m_LogFile << std::endl;
		};

		/*
		 *	改变Log文件
		 *	newFileName		新文件的文件名
		 *	bClearFile		是否清空文件
		 *	return			是否成功改变
		 */
		bool ChangeLogFile(
			const std::string& newFileName,
			bool bClearFile = false);

	private:

		FileLog(const FileLog& FL);

		/*
		 *	初始化
		 *	FileName	记录文件名字
		 *	bClearFile	是否清空文件
		 */
		void Init(
			const std::string& fileName,
			bool bClearFile);

		/*
		 *	清空
		 */
		void Clear(void);

		/*
		 *	根据不同数据类型写 LOG
		 */
		template<class T> 
		void WriteLogTemplate(
			const T& LogData, 
			LogMsgLevel LML)
		{
			//判断是否需要记录
			if(LML + m_LogLevel < BLK_LOG_THRESHOLD)
				return;

			//记录到文件中
			m_LogFile << LogData;
		}

	private:

		//记录文件流
		std::ofstream	m_LogFile;

	};

};

#endif
